www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第12章 常微分方程(组)数值求解/examp12_4_1.m

    function examp12_4_1
y01 = [0.8;0.1];%第一种方法的初值(第一方法只需要用到两个变量)
y0 = [0.8;0.1;0.1];%初值
tspan = [0 20];
%===============================
%方法1:变量替换
%===============================
%将y(3)用1-y(1)-y(2)代替
    function DyDt = DyDtNestedFun1(t,y)
        DyDt = [-0.2*y(1)+y(2)*(1-y(1)-y(2))+0.3*y(1)*y(2);
            2*y(1)*y(2)-5*y(2)*(1-y(1)-y(2))-2*y(2)^2];
    end
[T1,Y1] = ode45(@DyDtNestedFun1,tspan,y01);
%===============================
%方法2:设置质量矩阵,用ode15s函数
%===============================
M = [1 0 0;0 1 0;0 0 0];%质量矩阵
options = odeset('mass',M);
%被ode15s调用的微分函数表达式
    function DyDt = DyDtNestedFun2(t,y)
        DyDt = [-0.2*y(1)+y(2)*y(3)+0.3*y(1)*y(2);
            2*y(1)*y(2)-5*y(2)*y(3)-2*y(2)^2;
            y(1)+y(2)+y(3)-1];
    end
[T2,Y2] = ode15s(@DyDtNestedFun2,tspan,y0,options);
%===============================
%方法3:用ode15i函数
%===============================
%被ode15i调用的微分函数表达式
    function DyDt = DyDtNestedFun3(t,y,dy)
        DyDt = [dy(1)+0.2*y(1)-y(2)*y(3)-0.3*y(1)*y(2);
            dy(2)-2*y(1)*y(2)+5*y(2)*y(3)+2*y(2)^2;
            y(1)+y(2)+y(3)-1];
    end
%y(1)+y(2)+y(3)-1=0 表明y0中任何一个改变后都会至少引起其余一个发生变化,因此
y0_fix = [0;0;1];%任意两位位都可以改为0,比如[0;1;0]或者[1;0;0]
%状态变量一阶微分初值,例子中没有提供,因此可以随意猜测一组值
dy0 = [1;1;1];
%该组初值都可以改变,故全部为0
dy0_fix = [0;0;0];
%时间变量的初值
t0 = 0;
%计算输入到ode15i解算器的dy以及dy3
[y00,dy00] = decic(@DyDtNestedFun3,0,y0,y0_fix,dy0,dy0_fix);
[T3,Y3] = ode15i(@DyDtNestedFun3,tspan,y00,dy00);
%=========================
%画图呈现三个方法计算结果
%=========================
figure;
%方法1得到的图
subplot(131);
plot(T1,Y1(:,1),'k-','linewidth',2);
hold on
plot(T1,Y1(:,2),'k-.','linewidth',2);
plot(T1,1-Y1(:,1)-Y1(:,2),'k:','linewidth',2);
hold off
%图例,位置自动选择最佳位置
L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)','Location','best');
set(L,'fontname','Times New Roman');
xlabel('\itt','fontsize',16);title('方法1计算结果图')
%方法2得到的图
subplot(132);
plot(T2,Y2(:,1),'k-','linewidth',2);
hold on
plot(T2,Y2(:,2),'k-.','linewidth',2);
plot(T2,Y2(:,3),'k:','linewidth',2);
hold off
L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)','Location','best');
set(L,'fontname','Times New Roman');
xlabel('\itt','fontsize',16);title('方法2计算结果图')
%方法3得到的图
subplot(133);
plot(T3,Y3(:,1),'k-','linewidth',2);
hold on
plot(T3,Y3(:,2),'k-.','linewidth',2);
plot(T3,Y3(:,3),'k:','linewidth',2);
hold off
L = legend('{\ity}_1(t)','{\ity}_2(t)','{\ity}_3(t)','Location','best');
set(L,'fontname','Times New Roman');
xlabel('\itt','fontsize',16);title('方法3计算结果图')
end